package video_utils

import (
	"bytes"
	"fmt"
	"math"
	"os"
	"os/exec"
	"strconv"
	"strings"
)

// TranscodeVideo 转码视频文件为 h264 编码、25 帧每秒且无音频流的 mp4 文件
func TranscodeVideo(inputPath, outputPath string) error {
    // 使用 ffmpeg 命令进行转码
    cmd := exec.Command("/usr/bin/ffmpeg", "-i", inputPath, "-c:v", "h264", "-crf", "23", "-r", "25", "-an", outputPath)
    var out bytes.Buffer
    var stderr bytes.Buffer
    cmd.Stdout = &out
    cmd.Stderr = &stderr
    // 运行 ffmpeg 命令
    err := cmd.Run()
    if err != nil {
        fmt.Println(fmt.Sprint(err) + ": " + stderr.String())
        return err
    }
    return nil
}

// GenerateVideoCover 生成视频封面图像
func GenerateVideoCover(videoPath, coverPath string) error {
    // 使用 ffmpeg 命令生成封面图像
    cmd := exec.Command("/usr/bin/ffmpeg", "-i", videoPath, "-vf", "select='eq(n\\,0)'", "-frames:v", "1", coverPath)
    var out bytes.Buffer
    var stderr bytes.Buffer
    cmd.Stdout = &out
    cmd.Stderr = &stderr
    // 运行 ffmpeg 命令
    err := cmd.Run()
    if err != nil {
        fmt.Println(fmt.Sprint(err) + ": " + stderr.String())
        return err
    }
    return nil
}

// TranscodeAudio 将音频文件转码为 16000Hz、单声道的音频文件
func TranscodeAudio(inputPath, outputPath string) error {
    // 使用 ffmpeg 命令进行音频转码
    cmd := exec.Command("/usr/bin/ffmpeg", "-i", inputPath, "-ar", "16000", "-ac", "1", outputPath)
    var out bytes.Buffer
    var stderr bytes.Buffer
    cmd.Stdout = &out
    cmd.Stderr = &stderr
    // 运行 ffmpeg 命令
    err := cmd.Run()
    if err != nil {
        fmt.Println(fmt.Sprint(err) + ": " + stderr.String())
        return err
    }
    return nil
}

// GetAudioDuration 获取音频文件的时长，返回四舍五入后的分钟数
func GetAudioDuration(filePath string) (int, error) {
    // 使用 ffprobe 获取音频时长
    cmd := exec.Command("/usr/bin/ffprobe", "-v", "error", "-show_entries", "format=duration", "-of", "default=noprint_wrappers=1:nokey=1", filePath)
    var out bytes.Buffer
    cmd.Stdout = &out
    err := cmd.Run()
    if err != nil {
        return 0, fmt.Errorf("获取音频时长失败: %v", err)
    }

    // 解析时长并转换为 float64
    durationStr := strings.TrimSpace(out.String())
    duration, err := strconv.ParseFloat(durationStr, 64)
    if err != nil {
        return 0, fmt.Errorf("解析音频时长失败: %v", err)
    }

    // 将时长四舍五入为分钟
    minutes := int(math.Ceil(duration / 60))
    return minutes, nil
}


// CalculateCost 读取环境变量并计算费用
func CalculateCost(minutes int) (float64, error) {
	// 读取环境变量 PRICING_PER_MINUTE
	pricingPerMinuteStr := os.Getenv("PRICING_PER_MINUTE")
	
	// 将字符串转换为 float64
	pricingPerMinute, err := strconv.ParseFloat(pricingPerMinuteStr, 64)
	if err != nil {
		return 0, fmt.Errorf("无法解析 PRICING_PER_MINUTE: %v", err)
	}

	// 计算总费用
	totalCost := float64(minutes) * pricingPerMinute
	return totalCost, nil
}